from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client


class FastDFSStorage(Storage):
    """自定义Django文件存储系统"""
    def __init__(self, base_url=None, client_conf=None):
        """
        初始化
        :param base_url:用于构造图片完整路径使用，图片服务器的域名
        :param client_conf:FastDFS客户端配置文件的路径
        """
        # if base_url is None:
        #     base_url = settings.FDFS_URL
        # self.base_url = base_url
        # if client_conf is None:
        #     client_conf = settings.FDFS_CLIENT_CONF
        # self.client_conf = client_conf

        # 简写
        # self.client_conf = settings.FDFS_CLIENT_CONF if client_conf == None else client_conf
        # self.client_conf = client_conf if client_conf else settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_URL

    def _open(self):
        """自定义文件存储系统类的目的,只是为了上传和下传,用不到打开文件，所以省略"""
        pass

    def _save(self, name, content):
        """
        在FastDFS中保存文件，上传图片调用此方法
        :param name: 上传的文件名称
        :param content: 上传的文件内容
        :return: 返回file_id将来会自动存储到image字段
        """
        # 创建fdfs客户端
        # client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_conf)

        # 上传文件
        # 指定一个文件路径和文件名来上传文件  filename上传的图片文件有后缀
        # ret = client.upload_by_filename()

        # 通过文件数据的二进制来上传  上传的图片文件没有后缀
        ret = client.upload_by_buffer(content.read())

        # 安全判断
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")

        # 返回file_id
        file_name = ret.get("Remote file_id")
        return file_name


    def url(self, name):
        """
        返回文件的完整的url
        :param name: 数据库中保存的文件名(此name是当初save方法中返回的file_id)
        :return: 完整的url　　storage ip:端口 + file_id
        """
        # return 'http://192.168.103.210:8888/' + name
        # return settings.FDFS_BASE_URL + name
        return self.base_url + name

    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        :param name:  要进行判断上不上传的文件名
        :return: True或False 如果返回False表示此方法不存在,就上传,如果返回True表示文件已存在就不上传
        """
        return False
